/*lic*/
#ifndef __MAIN_H__
#define __MAIN_H__

#include "hc32_ll.h"

// #include "ML307RDC_Module.h"

#include "BufDef.h"

#include <rtthread.h>

#include <stdbool.h>

#define SDRAM3_POOL_START 0x20040000
#define SDRAM3_POOL_END 0x2004FFFF
#define SDRAM3_VAL_START 0x20050000
#define SDRAM3_VAL_END 0x20057FFF
// ECC
#define SDRAM4_START 0x20058000 
#define SDRAM4_END 0x2005FFFF

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5

#define USART_BUF_LIST_SIZE 3
#define USART_BUF_SIZE 1536

// 发送完成解锁信号量。用来解决DMA的异步发送阻塞问题
extern rt_sem_t debug_usart_sem;
extern struct rt_messagequeue debug_usart_mq;
extern char debug_usart_tx_buf[1024];
extern size_t led_busy_times;
// 创建控制台接收邮箱
extern struct rt_messagequeue finsh_usart_mq;

// 注意，这里使用外部可挂载内存时候定义方式会变，会变成动态加载。
// 定义缓冲区对象
typedef struct __Tag_Usart_Transport_Bufs_Def {	
	size_t data_len;
	uint8_t data[USART_BUF_SIZE];
	
	// 获取管理对象指针。数组对象就是整个结构体的第n个成员。即管理对象地址+数组前变量总长度=数组地址。逆推可推出指针原地址。
	void* (*GetManagerAddr)(struct __Tag_Usart_Transport_Bufs_Def* self);
} Usart_Transport_Bufs_Def;

// 定义缓冲区指针管理对象
typedef struct __Tag_Usart_Transport_Bufs_Manager_Def {
  Usart_Transport_Bufs_Def* read_seek;
	Usart_Transport_Bufs_Def* write_seek;
	
	Usart_Transport_Bufs_Def data_list[USART_BUF_LIST_SIZE];
	
	size_t read_line;
	size_t write_line;
	
	void (*ClearBufs)(struct __Tag_Usart_Transport_Bufs_Manager_Def* self);
} Usart_Transport_Bufs_Manager_Def;

// 获取管理对象指针。
void* GetManagerAddrInterface(Usart_Transport_Bufs_Def* self);
// 清空缓冲区
void ClearBufsInterface(struct __Tag_Usart_Transport_Bufs_Manager_Def* self);

extern bool run_healthy;
// U1发送缓冲区
extern Usart_Transport_Bufs_Manager_Def u1_tx_bufs_manager;
// U1接收缓冲区
extern Usart_Transport_Bufs_Manager_Def u1_rx_bufs_manager;

#endif /* __MAIN_H__ */

/*eof*/
